import { useRouter } from "next/router"; import { api } from "@/src/utils/api"; import TracesTable from "@/src/components/table/use-cases/traces"; import ScoresTable from "@/src/components/table/use-cases/scores"; import { compactNumberFormatter, usdFormatter } from "@/src/utils/numbers"; import { StringParam, useQueryParam, withDefault } from "use-query-params"; import { DetailPageNav } from "@/src/features/navigate-detail-pages/DetailPageNav"; import SessionsTable from "@/src/components/table/use-cases/sessions"; import { cn } from "@/src/utils/tailwind"; import { Badge } from "@/src/components/ui/badge"; import { ActionButton } from "@/src/components/ActionButton"; import { LayoutDashboard } from "lucide-react"; import Page from "@/src/components/layouts/page"; import { useV4Beta } from "@/src/features/events/hooks/useV4Beta"; import { ObservationsEventsTable } from "@/src/features/events/components"; const tabs = ["Traces", "Sessions", "Scores"] as const; export default function UserPage() { const router = useRouter(); const userId = router.query.userId as string; const projectId = router.query.projectId as string; const { isBetaEnabled } = useV4Beta(); // Legacy API call (traces-based) const userLegacy = api.users.byId.useQuery( { projectId: projectId, userId, }, { enabled: !isBetaEnabled }, ); // Beta API call (events-based) const userBeta = api.users.byIdFromEvents.useQuery( { projectId: projectId, userId, }, { enabled: isBetaEnabled }, ); const user = isBetaEnabled ? userBeta : userLegacy; const [currentTab, setCurrentTab] = useQueryParam( "tab", withDefault(StringParam, tabs[0]), ); const renderTabContent = () => { switch (currentTab as (typeof tabs)[number]) { case "Sessions": return ; case "Traces": return ; case "Scores": return ; default: return null; } }; const handleTabChange = async (tab: string) => { if (router.query.filter || router.query.orderBy) { const newQuery = { ...router.query }; delete newQuery.filter; delete newQuery.orderBy; await router.replace({ query: newQuery }); } setCurrentTab(tab); }; return ( } > Dashboard `/project/${projectId}/users/${encodeURIComponent(entry.id)}` } listKey="users" /> ), }} > <> {user.data && (
Observations:{" "} {compactNumberFormatter(user.data.totalObservations)} Traces: {compactNumberFormatter(user.data.totalTraces)} Total Tokens: {compactNumberFormatter(user.data.totalTokens)} Total Cost: {usdFormatter(user.data.sumCalculatedTotalCost)} Active:{" "} {user.data.firstTrace ? `${user.data.firstTrace.toLocaleString()} - ${user.data.lastTrace?.toLocaleString()}` : isBetaEnabled ? "No activity yet" : "No traces yet"}
)}
{renderTabContent()}
); } type TabProps = { userId: string; projectId: string; }; function ScoresTab({ userId, projectId }: TabProps) { return ( ); } function TracesTab({ userId, projectId }: TabProps) { const { isBetaEnabled } = useV4Beta(); if (isBetaEnabled) { return ; } return ( ); } function SessionsTab({ userId, projectId }: TabProps) { return ( ); }